package com.woniuxy.creditsystem.util;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;

/**
 * 解析excel文件的工具类,传入一个excel文件,返回一个二维集合
 */
public class Analysis {
    /**
     * 解析具体的方法
     *
     * @param file
     * @return
     */
    public static ArrayList<ArrayList> analysis(MultipartFile file) throws IOException {
        ArrayList<ArrayList> table = new ArrayList<>();
        //获取文件名称
        String fileName = file.getOriginalFilename();
        System.out.println(fileName);
        //获得文件的流对象
        InputStream in = file.getInputStream();
        //判断excel版本
        Workbook workbook = null;
        if (judegExcelEdition(fileName)) {
            workbook = new XSSFWorkbook(in);
        } else {
            workbook = new HSSFWorkbook(in);
        }
        //获取第一张工作表
        Sheet sheet = workbook.getSheetAt(0);
        //从第一行开始获取数据
        for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
            //循环获取工作表的每一行
            Row sheetRow = sheet.getRow(i);
            //循环获取每一列
            ArrayList cells = new ArrayList<>();
            for (int j = 0; j < sheetRow.getPhysicalNumberOfCells(); j++) {
                //得到每一行每一列的数据
                Cell cell = sheetRow.getCell(j);
                //防止出现null的单元格
                //得到单元格的类型
                CellType cellType = cell.getCellTypeEnum();
                //判断单元格类型
                switch (cellType) {
                    case NUMERIC://可能为数字或者日期
                        if (DateUtil.isCellDateFormatted(cell)) {
                            //如果进来，则说明这是日期类型
                            Date cellValue = cell.getDateCellValue();
                            cells.add(cellValue);
                        } else {
                            //则说明是数值类型
                            double cellValue = cell.getNumericCellValue();
                            //向下转型
                            int value = (int) cellValue;
                            cells.add(cellValue);
                        }
                        break;
                    case STRING://字符串
                        String cellValue = cell.getStringCellValue();
                        cells.add(cellValue);
                        break;
                }


            }


            //将装有每一列的集合装入大集合
            table.add(cells);
            //关闭资源
            workbook.close();
        }
        return table;
    }

    /**
     * 判断上传的excel文件版本（xls为2003，xlsx为2017）
     *
     * @param fileName 文件路径
     * @return excel2007及以上版本返回true，excel2007以下版本返回false
     */
    private static boolean judegExcelEdition(String fileName) {
        if (fileName.matches("^.+\\.(?i)(xls)$")) {
            return false;
        } else {
            return true;
        }
    }
}